package hoaitt.edu.vnu;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;
/**
* TrinhNX 01/18 comment.
* Tư tưởng tốt hơn, trình bày dễ hiểu hơn tý.Đã đọc tut của cô, anh đoán chắc thế :3 :3
* Nói chung là làm quen với việc code hơn tý.
* Có 1 vài điểm anh nhận xét, nhìn comment nhá.
*/
public class CountingTriangle {
	
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		long N = input.nextInt();
		input.nextLine();
		long a, b, c;
		// Thằng map này có 1 cái đối số là capability, chính là thằng N
		// Map<Triangle, Integer>  triangle = new HashMap<Triangle, Integer>(N);
		Map<Triangle, Integer>  triangle = new HashMap<Triangle, Integer>();
		int count = 0;
		// Thật ra đề bài nó cho thế, nên mình sẽ chú ý đến type, chứ anh nghĩ ko cần check if dư lày :P
		// Họ cho thế có nghĩa là input sẽ nằm trong khoảng đó, nên là mấy cái if này luôn đúng :3
		if (N >= 1 && N <= Math.pow(10, 5)){
			for (int i = 0; i < N; i++) {
				a = input.nextLong();
				b = input.nextLong();
				c = input.nextLong();
				Triangle t1 = new Triangle(a, b, c);
				// Tương tự với cái này.
				if ((a >= 1 && a <= Math.pow(10, 15)) && (b >= 1 && b < Math.pow(10, 15))
						&& (c >= 1 && c < Math.pow(10, 15))) {
						/**
						* Flow đây là gì?
						* tao có 1 cái tam giác t1, để coi trong cái map của tao có chứa thằng này ko
						* nếu không thì tao thêm vào , còn nếu có , thì tốt nhất là ko thêm (:3)
						* Ở đây, có 2 cái trick, đó là có chứa 1 tam giác ko? Đọc cái hàm contains của map
						* để hiểu vì sao class Triangle implement hashCode vs equals :D
						*/
						// Ở đây, cô có nhận xét là mình chỉ kiểm tra nó có hay chưa thôi.
						// Nên dùng biến boolean ở đây là tốt nhất.
						// TODO: Bếu làm lại thử anh coi với boolean, và coi nó có nhanh hơn ko :v
					if (!(triangle.containsKey(t1))){
						triangle.put(t1, 1);
			
					} else {
						triangle.put(t1, i+1);
					}
				
				} else {
					System.out.println("Input out of ranger!");
				}
			}
		} else {
			System.out.println("Input need less than 10^5 and langer than 1.");
		}
		input.close();
		// Ở đây, lặp , thấy kiểu lặp này hay ko? Ko có for int i
		// Đây gọi là iterator :D, như kiểu linked list đấy :3 
		for (Object key : triangle.keySet()) {
		// THằng nào =1 chính là thằng chỉ có 1 lần xuất hiện.
			if (triangle.get(key) == 1) {
				count++;
			}
		}
		
		System.out.println(count);
		
	}

}

class Triangle {
	long edge [] = new long [3];
	
	public Triangle(){}
	public Triangle(long a, long b, long c) {
		edge[0] = a; edge[1] = b; edge[2] = c;
		Arrays.sort(edge);
	}
	
	// Gét cái hàm equals vì nó buộc phải cast :(
	@Override
	public boolean equals(Object obj) {
		if (obj instanceof Triangle) {
			return Arrays.equals(edge, ((Triangle) obj).edge);
		}
		return false;
	}
	
	@Override
	public int hashCode() {
		return Arrays.hashCode(edge);
	}
	
	@Override
	public String toString() {
		return super.toString();
	}
}

